package com.lin.carbon.interceptor;

import com.lin.carbon.utils.JwtUtils;
import com.lin.carbon.utils.RedisUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * JWT 拦截器，用于验证请求中的 JWT Token，并检查 Token 是否在 Redis 黑名单中
 */
@Component
public class JwtInterceptor implements HandlerInterceptor {

    // 注入 JwtUtils 工具类，用于验证和解析 JWT Token
    @Autowired
    private JwtUtils jwtUtils;

    // 注入 RedisUtils 工具类，用于操作 Redis 黑名单
    @Autowired
    private RedisUtils redisUtils;

    /**
     * 在请求处理之前进行拦截操作
     * @param request 客户端请求对象
     * @param response 服务器响应对象
     * @param handler 处理请求的处理器
     * @return 如果验证通过返回 true，否则返回 false
     * @throws Exception 处理过程中可能抛出的异常
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 从请求头中获取 Authorization 字段的值，即 JWT Token
        String token = request.getHeader("Authorization");
        if (token != null) {
            // 检查 Token 是否在 Redis 黑名单中
            if (redisUtils.isBlacklisted(token)) {
                // 如果在黑名单中，设置响应状态码为 401（未授权）
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                return false;
            }
            // 验证 Token 并获取账户名
            String accountName = jwtUtils.validateToken(token);
            if (accountName != null) {
                // 验证通过，允许请求继续处理
                return true;
            }
        }
        // 验证失败，设置响应状态码为 401（未授权）
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        return false;
    }
}
